www.gusucode.com > VC++ MFC绘图类实战笔记源代码-源码程序 > VC++ MFC绘图类实战笔记源代码-源码程序/code/20110107/day09.txt
一 MFC序列化 1 对象的序列化(反序列化) 1.1 对象的序列化的使用 1.1.1 定义支持序列化的类 1)是CObject的子孙类 2)添加支持序列化的宏 DECLARE_SERIAL IMPLEMENT_SERIAL 3)要重写函数Serialize virtual void Serialize( CArchive& ar ); 1.1.2 创建文件 1.1.3 定义CArchive 1.1.4 存储对象 1.1.5 关闭CArchive 1.1.6 关闭文件 1.2 序列化的实现 1.2.1 宏代码 class CAnimal : public CObject { _DECLARE_DYNCREATE( CAnimal ) AFX_API friend CArchive& AFXAPI operator>>(CArchive& ar, CAnimal * &pOb); } CObject* PASCAL CAnimal::CreateObject() { return new CAnimal; } _IMPLEMENT_RUNTIMECLASS( CAnimal, CObject, 0, CAnimal::CreateObject ) AFX_CLASSINIT _init_CAnimal( RUNTIME_CLASS(CAnimal) ); CArchive& AFXAPI operator>>(CArchive& ar, CAnimal* &pOb) { pOb = (CAnimal*) ar.ReadObject(RUNTIME_CLASS(CAnimal)); return ar; } 1.2.2 说明 1)_DECLARE_DYNCREATE 动态创建类 2)operator>> 读入操作符,读取对象 数据。不是CAnimal类的成员函数, 是一个CAnimal类的友员全局函数。 3) AFX_CLASSINIT _init_CAnimal 全局变量,在程序启动的时候被创建。 将CAnimal类RUNTIMECLASS信息 注册到程序中(保存到数据链表). 1.2.3 执行过程 初始化: 1) _init_CAnimal变量初始化,在构造 函数中,将类的CRuntimeClass地址 保存到程序AFX_MODULE_STATE的 全局变量中,使用m_classList保存 这个地址. 写入数据: 2) 使用"<<"写入对象数据,内部调用 CArchive的WriteObject函数. 3) 在WriteObject函数,将该对象的 CRuntimeClass信息中的版本号/ 类名称写入到文件. 4) 调用对象的Serialize,保存对象 内的相关数据. 读取数据: 5) 使用">>"读取对象数据,实际调用 的是该类的友员函数 (即在序列化宏中定义操作符). 6) 在">>"操作符中调用CArchive的 ReadObject函数读取对象. 7) 在ReadObject中从文件中读取 版本号和类名称 8) 根据读取的类名称,从m_classList 中,查找相应的CRuntimeClass的地址 9) 获取到CRuntimeClass地址,使用 CRuntimeClass的CreateObject函数 创建该类的对象. 10) 调用对象的Serialize函数,从 CArchive中读取对象内的数据. 1.3 类的Schema(版本) 1.3.1 通过IMPLEMENT_SERIAL宏 的第3个参数Schema来控制类的版本 1.3.2 定义版本时,需要增加 VERSIONABLE_SCHEMA 例如: IMPLEMENT_SERIAL( CAnimal, CObject, VERSIONABLE_SCHEMA|1 ) 1.3.3 读取数据时,要增加版本 判断处理 CArachive::GetObjectSchema获取 当前对象的版本号. 二 MFC对话框 1 MFC对话框 1.1 有模式对话框 1.2 无模式对话框 2 MFC APP对话框的使用 2.1 对话框窗口 2.2 应用程序主窗口 3 有模式对话框的使用 3.1 使用 3.1.1 定义对话框资源 3.1.2 定义对话框类 基于CDialog父类生成子类,将对话框 的资源ID通过构造函数传递给CDialog 3.1.3 显示对话框 int CDialog::DoModal() 3.1.4 WM_INITDIALOG映射为OnInitDialog 在这个函数中完成对话框数据的初始化 3.1.5 消息映射 使用消息映射宏完成消息处理 3.1.6 对话框的关闭 CDialog::OnOK - 确定的方式关闭, DoModal函数返回IDOK CDialog::OnCancel - 取消的方式关闭, DoModal函数返回IDCANCEL CDialog::EndDialog - 关闭并指定 返回值 3.2 DoModal执行 3.2.1 查找对话框资源 3.2.2 将父窗口设置成禁止输入状态 3.2.3 创建对话框窗口 3.2.4 调用消息循环,等候对话框关闭 执行3.2.5 3.2.5 将自己的窗口隐藏 3.2.6 将父窗口设置激活窗口 3.2.7 删除对话框窗口 3.2.8 返回对话框结束参数 4 无模式对话框 4.1 使用 4.1.1 定义对话框资源 4.1.2 定义对话框类 基于CDialog父类生成子类 4.1.3 创建对话框 CDialog::Create创建对话框 4.1.4 显示对话框 CDialog::ShowWindow显示 4.1.5 对话框的关闭 需要手动添加DestoryWindow函数 可以在OnOK/OnCancel当中 4.2 执行 4.2.1 查找资源 4.2.2 创建窗口